(use-modules (opencog))

;
; Definition for a specific puzzle
; This is the "Inkala" puzzle, claimed to be one of the hardest Sudoku
; puzzles ever created.
;
;  1 . . | . . 7 | . 9 .
;  . 3 . | . 2 . | . . 8
;  . . 9 | 6 . . | 5 . .
; -------+-------+------
;  . . 5 | 3 . . | 9 . .
;  . 1 . | . 8 . | . . 2
;  6 . . | . . 4 | . . .
; -------+-------+------
;  3 . . | . . . | . 1 .
;  . 4 . | . . . | . . 7
;  . . 7 | . . . | 3 . .
;
; Certain fixed numbers appear in certain fixed cell locations.
; Row 1
(Edge (Predicate "fix11:1") (Concept "one"))
(Edge (Predicate "fix16:7") (Concept "seven"))
(Edge (Predicate "fix18:9") (Concept "nine"))

; Row 2
(Edge (Predicate "fix22:3") (Concept "three"))
(Edge (Predicate "fix25:2") (Concept "two"))
(Edge (Predicate "fix29:8") (Concept "eight"))

; Row 3
(Edge (Predicate "fix33:9") (Concept "nine"))
(Edge (Predicate "fix34:6") (Concept "six"))
(Edge (Predicate "fix37:5") (Concept "five"))

; Row 4
(Edge (Predicate "fix43:5") (Concept "five"))
(Edge (Predicate "fix44:3") (Concept "three"))
(Edge (Predicate "fix47:9") (Concept "nine"))

; Row 5
(Edge (Predicate "fix52:1") (Concept "one"))
(Edge (Predicate "fix55:8") (Concept "eight"))
(Edge (Predicate "fix59:2") (Concept "two"))

; Row 6
(Edge (Predicate "fix61:6") (Concept "six"))
(Edge (Predicate "fix66:4") (Concept "four"))

; Row 7
(Edge (Predicate "fix71:3") (Concept "three"))
(Edge (Predicate "fix78:1") (Concept "one"))

; Row 8
(Edge (Predicate "fix82:4") (Concept "four"))
(Edge (Predicate "fix89:7") (Concept "seven"))

; Row 9
(Edge (Predicate "fix93:7") (Concept "seven"))
(Edge (Predicate "fix97:3") (Concept "three"))

(define (puzzle-9x9-inkala)
	(CollectionOf
	(QueryLink
		; There are eighty-one variables! 81 = 9x9 cells
		(VariableList
			(map
				(lambda (var) (TypedVariable var (Type 'Concept)))
				(variable-decls)))
		(AndLink
			; For this puzzle, 21 of the variables are fixed immediately.
			; Row 1
			(Edge (Predicate "fix11:1") (Variable "$cell_11"))
			(Edge (Predicate "fix16:7") (Variable "$cell_16"))
			(Edge (Predicate "fix18:9") (Variable "$cell_18"))

			; Row 2
			(Edge (Predicate "fix22:3") (Variable "$cell_22"))
			(Edge (Predicate "fix25:2") (Variable "$cell_25"))
			(Edge (Predicate "fix29:8") (Variable "$cell_29"))

			; Row 3
			(Edge (Predicate "fix33:9") (Variable "$cell_33"))
			(Edge (Predicate "fix34:6") (Variable "$cell_34"))
			(Edge (Predicate "fix37:5") (Variable "$cell_37"))

			; Row 4
			(Edge (Predicate "fix43:5") (Variable "$cell_43"))
			(Edge (Predicate "fix44:3") (Variable "$cell_44"))
			(Edge (Predicate "fix47:9") (Variable "$cell_47"))

			; Row 5
			(Edge (Predicate "fix52:1") (Variable "$cell_52"))
			(Edge (Predicate "fix55:8") (Variable "$cell_55"))
			(Edge (Predicate "fix59:2") (Variable "$cell_59"))

			; Row 6
			(Edge (Predicate "fix61:6") (Variable "$cell_61"))
			(Edge (Predicate "fix66:4") (Variable "$cell_66"))

			; Row 7
			(Edge (Predicate "fix71:3") (Variable "$cell_71"))
			(Edge (Predicate "fix78:1") (Variable "$cell_78"))

			; Row 8
			(Edge (Predicate "fix82:4") (Variable "$cell_82"))
			(Edge (Predicate "fix89:7") (Variable "$cell_89"))

			; Row 9
			(Edge (Predicate "fix93:7") (Variable "$cell_93"))
			(Edge (Predicate "fix97:3") (Variable "$cell_97"))

			; Aside from the above 21 constraints, there are another
			; there are 81+27 constraints. 81 of these say that each
			; of the 81 variables must be a number.  The remaining 27
			; constraints state that nine columns, rows and boxes must
			; have the right form.
			(sudoku-constraints)
		)
		; The solution
		(ListLink (variable-decls))
	)
	)
)
